import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

public class threeSum {
    public List<List<Integer>> threeSum(int[] nums) {
        //排序
        Arrays.sort(nums);
        List<List<Integer>> ret = new ArrayList<>();
        //固定一个数
        for (int i = 0; i < nums.length; i++) {
            // 若当前数大于0，后续数都更大，三数之和不可能为0，直接退出
            if (nums[i] > 0) {
                break;
            }
            // 去重：跳过与前一个数相同的i（避免重复三元组）
            if (i > 0 && nums[i] == nums[i-1]) {
                continue;
            }
            // 双指针：左指针从i+1开始，右指针从末尾开始
            int left = i + 1;
            int right = nums.length - 1;
            int target = -nums[i]; // 目标和：nums[left] + nums[right] = -nums[i]

            while (left < right) {
                int sum = nums[left] + nums[right];
                if (sum == target) {
                    // 找到有效三元组，加入结果集
                    ret.add(Arrays.asList(nums[i], nums[left], nums[right]));
                    // 去重：跳过左指针相同的元素
                    while (left < right && nums[left] == nums[left + 1]) {
                        left++;
                    }
                    // 去重：跳过右指针相同的元素
                    while (left < right && nums[right] == nums[right - 1]) {
                        right--;
                    }
                    // 移动双指针，继续寻找下一组解
                    left++;
                    right--;
                } else if (sum < target) {
                    // 和太小，左指针右移增大和
                    left++;
                } else {
                    // 和太大，右指针左移减小和
                    right--;
                }
            }
        }

        return ret;
    }
}
